home *** CD-ROM | disk | FTP | other *** search
/ World of Video / World of Video.iso / gfxprograms / 3dprograms / rayshade-4.0 / fixes / fix024 / libshade / shade.c.diff < prev    next >
Text File  |  1995-02-13  |  6KB  |  188 lines

  1. *** shade.c    Mon Oct 11 14:59:56 1993
  2. --- shade.c.frac    Mon Oct 11 14:46:03 1993
  3. ***************
  4. *** 27,32 ****
  5. --- 27,33 ----
  6.   #include "libsurf/atmosphere.h"
  7.   #include "options.h"
  8.   #include "stats.h"
  9. + #include "viewing.h"
  10.   
  11.   Medium    TopMedium;
  12.   Atmosphere *AtmosEffects;
  13. ***************
  14. *** 119,125 ****
  15.        */
  16.       for (lp = Lights; lp; lp = lp->next)
  17.           LightRay(lp, pos, nrm, gnrm, smooth, &refl, surf,
  18. !                 ray->depth, ray->sample, ray->time, color);
  19.   
  20.       if (ray->depth >= Options.maxdepth)
  21.           /*
  22. --- 120,126 ----
  23.        */
  24.       for (lp = Lights; lp; lp = lp->next)
  25.           LightRay(lp, pos, nrm, gnrm, smooth, &refl, surf,
  26. !                 ray, color);
  27.   
  28.       if (ray->depth >= Options.maxdepth)
  29.           /*
  30. ***************
  31. *** 162,185 ****
  32.    * Lighting calculations
  33.    */
  34.   static void
  35. ! LightRay(lp, pos, norm, gnorm, smooth, reflect, surf, depth, samp, time, color)
  36.   Light *lp;            /* Light source */
  37.   Vector *pos, *norm, *gnorm;    /* hit pos, shade norm, geo norm */
  38.   int smooth;            /* true if shade and geo norm differ */
  39.   Vector *reflect;        /* reflection direction */
  40.   Surface *surf;            /* surface characteristics */
  41. ! int depth, samp;        /* ray depth, sample # */
  42. ! Float time;
  43.   Color *color;            /* resulting color */
  44.   {
  45.       Color lcolor;
  46.       Ray newray;
  47. !     Float costheta, cosalpha, dist;
  48.   
  49.       newray.pos = *pos;
  50. !     newray.depth = depth;
  51. !     newray.sample = samp;
  52. !     newray.time = time; 
  53.       newray.media = (Medium *)NULL;    
  54.   
  55.       LightDirection(lp, pos, &newray.dir, &dist);
  56. --- 163,186 ----
  57.    * Lighting calculations
  58.    */
  59.   static void
  60. ! LightRay(lp, pos, norm, gnorm, smooth, reflect, surf, ray, color)
  61.   Light *lp;            /* Light source */
  62.   Vector *pos, *norm, *gnorm;    /* hit pos, shade norm, geo norm */
  63.   int smooth;            /* true if shade and geo norm differ */
  64.   Vector *reflect;        /* reflection direction */
  65.   Surface *surf;            /* surface characteristics */
  66. ! Ray *ray;
  67.   Color *color;            /* resulting color */
  68.   {
  69.       Color lcolor;
  70.       Ray newray;
  71. !     Float costheta, cosalpha, cosphi, dist;
  72.   
  73. +         newray.type = SHADOW_RAY;
  74.       newray.pos = *pos;
  75. !     newray.depth = ray->depth;
  76. !     newray.sample = ray->sample;
  77. !     newray.time = ray->time; 
  78.       newray.media = (Medium *)NULL;    
  79.   
  80.       LightDirection(lp, pos, &newray.dir, &dist);
  81. ***************
  82. *** 186,191 ****
  83. --- 187,202 ----
  84.   
  85.       costheta = dotp(&newray.dir, norm);
  86.   
  87. + /* ray viewpoint is the position at the light source */
  88. +         VecAddScaled(newray.pos, dist, newray.dir, &newray.viewpoint);
  89. + /* shadow ray "sees" same area at intersection position as parent ray */
  90. +         cosphi = -dotp(&ray->dir, norm);
  91. +         if (cosphi < EPSILON) cosphi = EPSILON;
  92. +         newray.width = PixelSize(ray, VecDist(&newray.pos, &ray->pos)) / cosphi * costheta;
  93. + /* shadow rays become smaller as they approach the light source */
  94. +         newray.viewdist = -dist;   
  95. +         newray.stretch = 1.;
  96.       if (smooth) {
  97.           cosalpha = dotp(&newray.dir, gnorm); 
  98.           /*
  99. ***************
  100. *** 278,287 ****
  101.   {
  102.       int total_int_refl = FALSE;
  103.       Ray NewRay;
  104. !     Float dist;
  105.       Color newcol;
  106.       HitList hittmp;        /* Geom intersection record */
  107.   
  108.       NewRay.pos = *pos;        /* Origin == hit point */
  109.       NewRay.media = ray->media;    /* Media == old media */
  110.       NewRay.sample = ray->sample;
  111. --- 289,299 ----
  112.   {
  113.       int total_int_refl = FALSE;
  114.       Ray NewRay;
  115. !     Float dist, cosi, cosr;
  116.       Color newcol;
  117.       HitList hittmp;        /* Geom intersection record */
  118.   
  119. +         NewRay.type = REFRACT_RAY;
  120.       NewRay.pos = *pos;        /* Origin == hit point */
  121.       NewRay.media = ray->media;    /* Media == old media */
  122.       NewRay.sample = ray->sample;
  123. ***************
  124. *** 322,327 ****
  125. --- 334,360 ----
  126.        */
  127.   
  128.       if (!total_int_refl) {
  129. + /* good for planar refraction only */
  130. + /* cosi = cos angle(incident ray, surface normal)
  131. +  * cosr = cos angle(refracted ray, surface normal) */
  132. +                 cosi = -dotp(&ray->dir, norm);                
  133. +         if (cosi < EPSILON) cosi = EPSILON;
  134. +                 cosr = -dotp(&NewRay.dir, norm);                
  135. + /*
  136. +  *                       nr   cosr  2
  137. +  * NewRay.viewdist = y = -- ( ---- )  * x 
  138. +  *                       ni   cosi
  139. +  * where x = distance newray origin to oldray viewpoint.
  140. +  */
  141. +                 NewRay.viewdist = (NewRay.media ? NewRay.media->index : TopMedium.index) / (ray->media ? ray->media->index : TopMedium.index) * 
  142. +                                 (cosr * cosr) / (cosi * cosi) * 
  143. +                                 (ray->viewdist < 0. ? -1. : 1.) * VecDist(&ray->viewpoint, &NewRay.pos);
  144. + /* NewRay.viewpoint = NewRay.pos - y * NewRay.dir */
  145. +                 VecAddScaled(NewRay.pos, -NewRay.viewdist, NewRay.dir, &NewRay.viewpoint);
  146. + /* both rays "see" same area at intersection point */
  147. +                 NewRay.width = PixelSize(ray, VecDist(&ray->pos, &NewRay.pos)) * cosr / cosi;
  148. +                 NewRay.stretch = 1.;
  149.           Stats.RefractRays++;
  150.           hittmp.nodes = 0;
  151.           dist = FAR_AWAY;
  152. ***************
  153. *** 360,365 ****
  154. --- 393,399 ----
  155.       Color newcol;
  156.       Float dist;
  157.   
  158. +         NewRay.type = REFLECT_RAY;
  159.       NewRay.pos = *pos;        /* Origin == hit point */
  160.       NewRay.dir = *dir;        /* Direction == reflection */
  161.       NewRay.media = ray->media;    /* Medium == old medium */
  162. ***************
  163. *** 366,371 ****
  164. --- 400,413 ----
  165.       NewRay.sample = ray->sample;
  166.       NewRay.time = ray->time;
  167.       NewRay.depth = ray->depth + 1;
  168. + /* good for planar reflections only */
  169. + /* new viewpoint is mirrored old one. width at intersection point is the same */
  170. +         NewRay.viewdist = (ray->viewdist < 0. ? -1. : 1.) * VecDist(&ray->viewpoint, &NewRay.pos);
  171. +         NewRay.width = PixelSize(ray, VecDist(&ray->pos, &NewRay.pos));
  172. +         VecAddScaled(NewRay.pos, -NewRay.viewdist, NewRay.dir, &NewRay.viewpoint);
  173. +         NewRay.stretch = 1.;
  174.       Stats.ReflectRays++;
  175.       hittmp.nodes = 0;
  176.       dist = FAR_AWAY;
  177. ***************
  178. *** 374,376 ****
  179. --- 416,419 ----
  180.       ColorMultiply(newcol, *intens, &newcol);
  181.       ColorAdd(*color, newcol, color);
  182.   }
  183.